package demo4;

public class Main {
    public static void main(String[] args) {
//        //第1种、子类泛型，父类泛型，泛型的标识符至少有一个一定相同(即使子类泛型扩展)
//        System.out.println("ChildFirst <T> extends Parent <T>::");
//        ChildFirst<Integer> intChildFirst = new ChildFirst<>();
//
//        //注意点1：通过子类对象调用从父类继承的父类方法，将值放入父类中
//        intChildFirst.setValue(12);
//
//        //注意点2：通过子类对象调用重写的父类方法，发生动态绑定，获取父类存储的数据。
//        Integer value1 = intChildFirst.getValue();
//        System.out.println(value1);
//        System.out.println("=======================");
//
//
//        //第2种、子类非泛型，父类泛型，父类的数据类型必须明确
//        System.out.println("ChildSecond extends Parent <String>::");
//        ChildSecond strChildSecond = new ChildSecond();  //普通类
//        strChildSecond.setValue("树脂666");
//        String value3 = strChildSecond.getValue();
//        System.out.println(value3);

        //第3种、子类泛型，父类非泛型，以Object操作
        System.out.println("ChildThird <T> extends Parent::");
        ChildThird<String> strChildThird = new ChildThird<>();
        strChildThird.setValue("小黑子");

        //注意，get出来用Object类接收
        Object value2 = strChildThird.getValue();
        System.out.println(value2);


        //第4种、子类非泛型，父类非泛型。那子类操作Object

        //总结：泛型类派生子类，
        // 1、子类是泛型类，那么子类的泛型标识符至少有一个与父类相同
        // 2、子类不是泛型类，那么父类的数据类型必须明确
        // 3、父类不是泛型，那总是执行Object的操作
    }
}
